add move_selected signal to allow overriding the default internal
authorMatthias Clasen <mclasen@redhat.com>
Fri, 15 Jun 2007 19:08:08 +0000 (19:08 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 15 Jun 2007 19:08:08 +0000 (19:08 +0000)
2007-06-15  Matthias Clasen  <mclasen@redhat.com>

        * gtk/gtkmenushell.[ch]: add move_selected signal to allow
        overriding the default internal behaviour.  (#446833, Ryan Lortie)

svn path=/trunk/; revision=18145

ChangeLog
gtk/gtkmenushell.c
gtk/gtkmenushell.h

index 2b7f0a1d3c85d00f29f3d130211c28ddbedd9de2..4dba5a61bc171888da2402cc1d36233af3830aff 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-06-15  Matthias Clasen  <mclasen@redhat.com>
+       
+       * gtk/gtkmenushell.[ch]: add move_selected signal to allow 
+       overriding the default internal behaviour.  (#446833, Ryan Lortie)
+
 2007-06-15  Mathias Hasselmann  <mathias.hasselmann@gmx.de>
 
        * gtk/gtkwidget.c: Forgot to free the unescaped tooltip text.
index 250c0ac7372a1b5cc6d1c094329791970da8025f..79422f95873bd5d606f3001498c20830305f3915 100644 (file)
@@ -57,6 +57,7 @@ enum {
   ACTIVATE_CURRENT,
   CANCEL,
   CYCLE_FOCUS,
+  MOVE_SELECTED,
   LAST_SIGNAL
 };
 
@@ -193,6 +194,8 @@ static void gtk_real_menu_shell_cycle_focus      (GtkMenuShell      *menu_shell,
 static void     gtk_menu_shell_reset_key_hash    (GtkMenuShell *menu_shell);
 static gboolean gtk_menu_shell_activate_mnemonic (GtkMenuShell *menu_shell,
                                                  GdkEventKey  *event);
+static gboolean gtk_menu_shell_real_move_selected (GtkMenuShell  *menu_shell, 
+                                                  gint           distance);
 
 static guint menu_shell_signals[LAST_SIGNAL] = { 0 };
 
@@ -237,6 +240,7 @@ gtk_menu_shell_class_init (GtkMenuShellClass *klass)
   klass->cancel = gtk_real_menu_shell_cancel;
   klass->select_item = gtk_menu_shell_real_select_item;
   klass->insert = gtk_menu_shell_real_insert;
+  klass->move_selected = gtk_menu_shell_real_move_selected;
 
   menu_shell_signals[DEACTIVATE] =
     g_signal_new (I_("deactivate"),
@@ -289,7 +293,15 @@ gtk_menu_shell_class_init (GtkMenuShellClass *klass)
                             _gtk_marshal_VOID__ENUM,
                             G_TYPE_NONE, 1,
                             GTK_TYPE_DIRECTION_TYPE);
-
+  menu_shell_signals[MOVE_SELECTED] =
+    g_signal_new (I_("move_selected"),
+                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_SIGNAL_RUN_LAST,
+                 G_STRUCT_OFFSET (GtkMenuShellClass, move_selected),
+                 _gtk_boolean_handled_accumulator, NULL,
+                 _gtk_marshal_BOOLEAN__INT,
+                 G_TYPE_BOOLEAN, 1,
+                 G_TYPE_INT);
 
   binding_set = gtk_binding_set_by_class (klass);
   gtk_binding_entry_add_signal (binding_set,
@@ -1132,9 +1144,9 @@ gtk_menu_shell_activate_item (GtkMenuShell      *menu_shell,
 }
 
 /* Distance should be +/- 1 */
-static void
-gtk_menu_shell_move_selected (GtkMenuShell  *menu_shell, 
-                             gint           distance)
+static gboolean
+gtk_menu_shell_real_move_selected (GtkMenuShell  *menu_shell, 
+                                  gint           distance)
 {
   if (menu_shell->active_menu_item)
     {
@@ -1185,6 +1197,19 @@ gtk_menu_shell_move_selected (GtkMenuShell  *menu_shell,
       if (node)
        gtk_menu_shell_select_item (menu_shell, node->data);
     }
+
+  return TRUE;
+}
+
+/* Distance should be +/- 1 */
+static void
+gtk_menu_shell_move_selected (GtkMenuShell  *menu_shell, 
+                             gint           distance)
+{
+  gboolean handled = FALSE;
+
+  g_signal_emit (menu_shell, menu_shell_signals[MOVE_SELECTED], 0,
+                distance, &handled);
 }
 
 /**
@@ -1261,6 +1286,9 @@ gtk_menu_shell_select_submenu_first (GtkMenuShell     *menu_shell)
 {
   GtkMenuItem *menu_item;
 
+  if (menu_shell->active_menu_item == NULL)
+    return FALSE;
+
   menu_item = GTK_MENU_ITEM (menu_shell->active_menu_item); 
   
   if (menu_item->submenu)
index 9a4b3a01479b4da53e093971152e9588cfbedfe5..2595a74ff06a6a3c311f0b1de3172be90dcf6777 100644 (file)
@@ -84,11 +84,12 @@ struct _GtkMenuShellClass
                            GtkWidget    *child,
                            gint          position);
   gint (*get_popup_delay)  (GtkMenuShell *menu_shell);
+  gboolean (*move_selected) (GtkMenuShell *menu_shell,
+                            gint          distance);
 
   /* Padding for future expansion */
   void (*_gtk_reserved1) (void);
   void (*_gtk_reserved2) (void);
-  void (*_gtk_reserved3) (void);
 };